package com.laoxu.student.common.util;

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

/**
 * @Description: excel工具类
 * @Author laoxu
 * @Date 2020/1/24 16:00
 **/
public class ExcelUtil {
    private static final Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
    /**
     * 获取并解析excel文件，返回一个二维集合
     * @param file 上传的文件
     * @return 二维集合（第一重集合为行，第二重集合为列，每一行包含该行的列集合，列集合包含该行的全部单元格的值）
     */
    public static ArrayList<ArrayList<String>> analysis(MultipartFile file) {
        ArrayList<ArrayList<String>> result = new ArrayList<>();
        //获取文件名称
        String fileName = file.getOriginalFilename();
        System.out.println(fileName);

        try {
            //获取输入流
            InputStream in = file.getInputStream();
            //判断excel版本
            Workbook workbook = null;
            if (judegExcelEdition(fileName)) {
                workbook = new XSSFWorkbook(in);
            } else {
                workbook = new HSSFWorkbook(in);
            }

            //获取第一张工作表
            Sheet sheet = workbook.getSheetAt(0);
            //从第二行开始获取
            Row row=null;
            for (int i=0; i<sheet.getPhysicalNumberOfRows();i++) {
                row = sheet.getRow(i);
                //循环获取每一列
                ArrayList<String> list = new ArrayList<>();
                Cell cell = null;
               for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
                   // logger.info(i+":"+j);
                   cell = row.getCell(j);
                   if(cell==null){
                       cell = row.createCell(j);
                   }
                   cell.setCellType(CellType.STRING);

                   list.add(cell.getStringCellValue());
                }
                //将装有每一列的集合装入大集合
                result.add(list);

                //关闭资源
                workbook.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("===================未找到文件======================");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("===================上传失败======================");
        }
        return result;
    }
    /**
     * 判断上传的excel文件版本（xls为2003，xlsx为2017）
     * @param fileName 文件路径
     * @return excel2007及以上版本返回true，excel2007以下版本返回false
     */
    private static boolean judegExcelEdition(String fileName){
        return !fileName.matches("^.+\\.(?i)(xls)$");
    }

    /**
     *
     * @param sheet 要设置的sheet
     * @param textlist 下拉框显示的内容
     * @param firstRow 开始行
     * @param endRow 结束行
     * @param firstCol 开始列
     * @param endCol 结束列
     * @return
     */
    public static HSSFSheet setHSSFValidation(HSSFSheet sheet,
                                              String[] textlist, int firstRow, int endRow, int firstCol,
                                              int endCol) {
        // 加载下拉列表内容
        DVConstraint constraint = DVConstraint
                .createExplicitListConstraint(textlist);
        // 设置数据有效性加载在哪个单元格上,四个参数分别是：起始行、终止行、起始列、终止列
        CellRangeAddressList regions = new CellRangeAddressList(firstRow,
                endRow, firstCol, endCol);
        // 数据有效性对象
        HSSFDataValidation data_validation_list = new HSSFDataValidation(
                regions, constraint);
        sheet.addValidationData(data_validation_list);
        return sheet;
    }

    public static CellType convertCellType(String dataType){
        CellType cellType=CellType.STRING;
        switch (dataType){
            case "数值":
                cellType = CellType.NUMERIC;
                break;
        }

        return cellType;
    }

    /**
     *  根据数据类型获取excel列格式
     * @param dataType
     * @return
     */
    public static String getDataFormat(String dataType){
        String format="@";
        switch (dataType){
            case "数值":
                format="0";
                break;
            case "金额":
                format="0.00";
                break;
        }

        return format;
    }


}
